package org.example.actualcombat.demos.web.modules.pms.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.example.actualcombat.demos.web.modules.pms.mapper.PmsProductAttributeMapper;
import org.example.actualcombat.demos.web.modules.pms.model.PmsProductAttributeCategory;
import org.example.actualcombat.demos.web.modules.pms.model.PmsProductAttributeModel;
import org.example.actualcombat.demos.web.modules.pms.model.PmsProductCategoryModel;
import org.example.actualcombat.demos.web.modules.pms.model.dto.RelationAttrInfoDTO;
import org.example.actualcombat.demos.web.modules.pms.service.PmsProductAttributeCategoryService;
import org.example.actualcombat.demos.web.modules.pms.service.PmsProductAttributeService;
import org.example.actualcombat.demos.web.modules.pms.service.PmsProductCategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

//@RequiredArgsConstructor
@Service
public class PmsProductAttributeServiceImpl extends ServiceImpl<PmsProductAttributeMapper, PmsProductAttributeModel> implements PmsProductAttributeService {
    @Autowired
    PmsProductAttributeMapper pmsProductAttributeMapper;
    @Autowired
    PmsProductAttributeCategoryService pmsProductAttributeCategoryService;
    @Override
    public Page listSelf(int cid, int type ,int pageNum, int pageSize) {
        Page page = new Page(pageNum,pageSize);
        QueryWrapper<PmsProductAttributeModel> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(PmsProductAttributeModel::getProductAttributeCategoryId,cid)
                .eq(PmsProductAttributeModel::getType,type)
                .orderByAsc(PmsProductAttributeModel::getSort);
//        return pmsProductAttributeMapper.selectPage(page, queryWrapper); // 可以使用,是BaseMapper实现的分页
//        IService 的 page 方法是在 Service 层级中使用的，用于在 Service 中进行分页查询。
//        BaseMapper 的 selectPage 方法是在 Mapper 层级中使用的，用于在 Mapper 接口中进行分页查询。
//        return this.page(page,queryWrapper); // 可以使用 Iservice的分页
        return page(page,queryWrapper); // 也是this.page 只是隐藏this

    }

    @Override
    public Page list(int cid, int type, int pageNum, int pageSize) {
        Page page = new Page(pageNum,pageSize);
        QueryWrapper<PmsProductAttributeModel> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(PmsProductAttributeModel::getProductAttributeCategoryId,cid)
                .eq(PmsProductAttributeModel::getType,type);
        return this.page(page,queryWrapper);
    }

    @Override
    @Transactional
    public boolean save2(PmsProductAttributeModel pmsProductAttributeModel) {
        // 第一步： 提交保存 商品属性
        boolean save = this.save(pmsProductAttributeModel);
//        int insert = pmsProductAttributeMapper.insert(pmsProductAttributeModel);
        // 第二步： 成功后，更新外表的计算数量的数据
            // 先查询对应商品类型， 根据type 是0，就更新属性。 type是1 就更新参数
        if(save){
            UpdateWrapper<PmsProductAttributeCategory> updateWrapper = new UpdateWrapper<>();
            updateWrapper.lambda().eq(PmsProductAttributeCategory::getId,pmsProductAttributeModel.getProductAttributeCategoryId());
            if(pmsProductAttributeModel.getType() == 0){ // 属性
                updateWrapper.setSql("attribute_count=attribute_count+1"); // 这种方式可以直接更新
            }else if(pmsProductAttributeModel.getType() == 1){ // 参数
                updateWrapper.setSql("param_count=param_count+1");// 这种方式，可以先查。
            }
            pmsProductAttributeCategoryService.update(updateWrapper);
        }

        return save;
    }

    @Override
    @Transactional
    public boolean removeIds(List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)){ // mp的工具类,判断是否为空或者是null
            return false;
        }
        int size = ids.size();
        // 删除对应属性, 记录删除的个数
//        boolean b = this.removeByIds(ids); // 得到boolean,不方便.
        PmsProductAttributeModel pmsProductAttributeModel = null;
        for (Long id : ids) { // 这里只要判断一次, 有任何一个对象,就可以判断他的属性了.
            pmsProductAttributeModel = this.getById(id);
            if(pmsProductAttributeModel != null){
                break;
            }
        }

//        得到当前属性的类别
        int length = pmsProductAttributeMapper.deleteBatchIds(ids);



        if(length>0 && pmsProductAttributeModel!=null){ // 如果删除的数量大于0,就是有删除树龄,并且查找到了
            UpdateWrapper<PmsProductAttributeCategory> updateWrapper = new UpdateWrapper<>(); // 根据父级对象创建wrapper
            if (pmsProductAttributeModel.getType() == 0){ // 如果是0,就是属性列表
                updateWrapper.setSql("attribute_count=attribute_count-"+length); // 删除属性列表里的个数
            }else  if (pmsProductAttributeModel.getType() == 1){ // 参数列表
                updateWrapper.setSql("param_count=param_count-"+length); // 参数列表删除数量
            }
            updateWrapper.lambda().eq(PmsProductAttributeCategory::getId,pmsProductAttributeModel.getProductAttributeCategoryId()); // sql语句,id是父类model的id.
            pmsProductAttributeCategoryService.update(updateWrapper); // 使用的是父类的方法, sql是这里面写好的
        }
        return length>0;
    }

    @Override
    public List<RelationAttrInfoDTO> getRelationAttrInfoByCid(Long cid) {
        return pmsProductAttributeMapper.getRelationAttrInfoByCid(cid);
    }
//    @Override
//    public boolean save2(PmsProductAttributeModel pmsProductAttributeModel) {
//        boolean save = this.save(pmsProductAttributeModel);
//        return save;
//    }
}






























